/***********************************************************************************
 * 文件名： sg_ctrl.c
 * 版本： 1
 * 说明：
 * 		SGUI控制器，处理UI的切换、提供定时器。
 * 修改记录：
 * 	2024/01/10: 初版。 刘言。
***********************************************************************************/
#include "sg_ctrl.h"
#include "polsys.h"

static polsys_task_t mTimer;

static sg_page_base_t * mNowPage = NULL;

static void TimerEntry();

void Sg_Init()
{
    Polsys_InitTask(&mTimer, TimerEntry, POLSYS_WAITING_FOREVER);
}

void SgPage_Load(sg_page_creat_fun_t creat_fun, void *param)
{
    mNowPage = creat_fun(param);
    SgPage_NotifyEvent(SG_EV_PAGE_LOADED);
    // if(mNowPage->CallBack)
    // {
    //     sg_ev_t e;
    //     e.Code = SG_EV_PAGE_LOADED;
    //     e.Target = mNowPage;
    //     e.UserData = mNowPage->UserData;
    //     mNowPage->CallBack(&e);
    // }
}

void SgPage_Clear()
{
    if(mNowPage)
    {
        Polsys_SetInterval(&mTimer, POLSYS_WAITING_FOREVER);
        SgPage_NotifyEvent(SG_EV_PAGE_UNLOADED);
        // if(mNowPage->CallBack)
        // {
        //     sg_ev_t e;
        //     e.Code = SG_EV_PAGE_UNLOADED;
        //     e.Target = mNowPage;
        //     e.UserData = mNowPage->UserData;
        //     mNowPage->CallBack(&e);
        // }
        if(mNowPage->DeleteFun)mNowPage->DeleteFun(mNowPage);
        else free(mNowPage);
        mNowPage = NULL;
    }
}

void SgPage_SwitchTo(sg_page_creat_fun_t creat_fun, void *param)
{
    // 清除当前页面，腾出内存空间
    SgPage_Clear();
    // 创建并加载新页面
    SgPage_Load(creat_fun, param);
}

void SgPage_NotifyEvent(sg_ev_code_t ev_code)
{
    if(mNowPage)
    {
        if(mNowPage->CallBack)
        {
            sg_ev_t e;
            e.Code = ev_code;
            e.Target = mNowPage;
            e.UserData = mNowPage->UserData;
            mNowPage->CallBack(&e);
        }
    }
}

inline sg_page_base_t *SgPage_GetNowPage()
{
    return mNowPage;
}

void SgPage_SetTimerInterval(u16 interval)
{
    if(interval >= 0xE000)interval = 0X1FFE;
    Polsys_SetInterval(&mTimer, interval);
}


//////////////////////// 内部函数

static void TimerEntry()
{
    SgPage_NotifyEvent(SG_EV_TIMER_UPDATE);
}



